package org.i1510.base.utils;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;

import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.util.FileCopyUtils;

/**
 * Web字符串返回时的编码设置
 */
public class ConfigurableStringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
	public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");  

  
    public ConfigurableStringHttpMessageConverter() {  
        super(new MediaType("text", "plain", DEFAULT_CHARSET), MediaType.TEXT_PLAIN);   
    }  
  
    @Override  
    public boolean supports(Class<?> clazz) {  
        return String.class.equals(clazz);  
    }  
  
    @Override  
    protected String readInternal(@SuppressWarnings("rawtypes") Class clazz, HttpInputMessage inputMessage) throws IOException {  
        Charset charset = getContentTypeCharset(inputMessage.getHeaders().getContentType());  
        return FileCopyUtils.copyToString(new InputStreamReader(inputMessage.getBody(), charset));  
    }  
  
    @Override  
    protected Long getContentLength(String s, MediaType contentType) {  
        Charset charset = getContentTypeCharset(contentType);  
        try {  
            return (long) s.getBytes(charset.name()).length;  
        }  
        catch (UnsupportedEncodingException ex) {  
            throw new InternalError(ex.getMessage());  
        }  
    }  
  
    @Override  
    protected void writeInternal(String s, HttpOutputMessage outputMessage) throws IOException {  
//        if (writeAcceptCharset) {  
//            outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets());  
//        }  
        Charset charset = getContentTypeCharset(outputMessage.getHeaders().getContentType());  
        FileCopyUtils.copy(s, new OutputStreamWriter(outputMessage.getBody(), charset));  
    }  
  
  
    private Charset getContentTypeCharset(MediaType contentType) {  
//        if (contentType != null && contentType.getCharSet() != null) {  
//            return contentType.getCharSet();  
//        }  
//        else {  
//            return DEFAULT_CHARSET;  
//        }
    	return DEFAULT_CHARSET;
    }  
}
